package hongjiang.info

object TypeAndClass extends App {
  import scala.reflect.runtime.universe._
  class C
  println(typeOf[C])

  trait T

  Console println classOf[T]

  Console println typeOf[T]

  object O
  Console println (O.getClass()) // Class[_ <: O.type]

  class A { class B }
  val a1 = new A
  val a2 = new A
  val b1 = new a1.B
  val b2 = new a2.B

  b1.getClass == b2.getClass //true

  typeOf[a1.B] == typeOf[a2.B] //false

  typeOf[a1.B] <:< typeOf[A#B] //true
  /**
   * ，类(class)与类型(type)是两个不一样的概念
   * (在java里因为早期一直使用class表达type，并且现在也延续这样的习惯)；
   * 类型(type)比类(class)更”具体”，任何数据都有类型。类是面向对象系统里对同一类数据的抽象，
   * 在没有泛型之前，类型系统不存在高阶概念，直接与类一一映射，
   * 而泛型出现之后，就不在一一映射了。比如定义class List[T] {},
   * 可以有List[Int] 和 List[String]等具体类型，
   * 它们的类是同一个List，但类型则根据不同的构造参数类型而不同。
   */
  
  classOf[List[Int]] == classOf[List[String]]//true
  
  typeOf[List[Int]] == typeOf[List[String]]//false
}